import axios from 'axios'
import qs from 'qs'
import config from '@/config'
const baseURL = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro
/* eslint-disable */
import { MessageBox, Loading, Message } from 'element-ui';
let loading

function startLoading () { // 加载开始动画
  loading = Loading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(0, 0, 0, 0.7)'
  })
}
function endLoading () { // 加载结束动画
  loading.close()
}

function toGrant () { // 是否跳转登录页面
  MessageBox.confirm("请先登录", "提示", {
    confirmButtonText: "前往登录",
    cancelButtonText: "暂不登录",
    type: "warning"
    }).then(() => {
      
    }).catch(() => { });
}

function getInsideConfig () { // 这个函数负责返回基础配置的参数
  const config = {
    baseURL,
    headers: {
      //
    },
    // 允许跨域携带cookie
    withCredentials: true,
    transformRequest: [params => qs.stringify(params)]
  }
  return config
}

const USER_ERROR = [10, 11, 12, 13, 14] // 状态码

/**
 *
 * check：是否传token  //  这个相当于token
 * loading：是否显示loading加载
 * tip：是否前往登录
 * status：预期返回的 状态码
 * statusFun: 根据预期返回的状态码执行相对应的函数
 * */

/* eslint-disable */
function interceptors(instance, options, check = true, loading = true, tip = true, status = [], statusFun) { //instance 就是axios 在request中被赋值了  此处请求拦截 和 响应
  // 请求拦截
  instance.interceptors.request.use(config => {
    //加载动画的开启
    loading && startLoading()
    // 需要校验token 修改头部
    if (check){
      let token = localStorage.getItem('token') || ''
      options.headers.token = token
    }
    // end


    return config
  }, error => {
    return Promise.reject(error)
  })


  // 响应拦截
  instance.interceptors.response.use(({ data }) => {

    //加载结束的动画
    loading && endLoading()

    return data
  }, error => {
      Message.error(error.response.data)
      const { status } = error.response
      if (USER_ERROR.includes(status)) {
        toGrant() // 'token值无效，请重新登录'
      }
      return Promise.reject(error)
  })
}

/**
 * options : axios中的相关参数 data url header等
 * check：是否传ticket  //  这个相当于token
 * loading：是否显示loading加载
 * tip：是否前往登录
 * status：预期返回的 状态码 
 * statusFun: 根据预期返回的状态码执行相对应的函数
 * */

/* eslint-disable */
function request(options, { check = true, loading = true, tip = true, status = [], statusFun } = {}) {
  const instance = axios.create()  // 此处获取实例
  options = Object.assign(getInsideConfig(), options) //getInsideConfig() 返回配置 options 最终的配置参数
  interceptors(instance, options, check, loading, tip, status, statusFun) // interceptors这个是响应和请求拦截函数
  return instance(options)
}

export default request